package com.onetime.mall.trading.utils;

import com.onetime.mall.trading.constants.SystemConstant;
import com.onetime.mall.trading.entity.UserEntity;
import com.sun.jersey.core.util.Base64;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Date;
import java.util.HashMap;
import java.util.UUID;

public class JwtUtils {
    static SecretKey key = generalKey();
    //有效期为2小时
    private static final Long time = 1000 * 60 * 60*2L;// 60 * 60 *1000*2  2个小时


    public static String createJwt(UserEntity userEntity) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("data", userEntity);
        JwtBuilder jwtBuilder = Jwts.builder()
                /*签名算法以及密匙*/
                .signWith(SignatureAlgorithm.HS256, key)
                /*body部分，要唯一*/
                .setClaims(map)
                /*设置签发之间，保证每次token都不一样*/
                .setIssuedAt(new Date())
                /*设置过期时间*/
                .setExpiration(new Date(System.currentTimeMillis() + time))
                .setId(UUID.randomUUID().toString())
                .setSubject("LoginAuthentication");
        /*生成token*/
        return jwtBuilder.compact();
    }

    /*生成签名的时候使用的秘钥secret,这个方法本地封装了的，一般可以从本地配置文件中读取，
    切记这个秘钥不能外露哦。它就是你服务端的私钥，在任何场景都不应该流露出去。
    一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。*/
    public static SecretKey generalKey() {
        byte[] encodedKey = Base64.decode(SystemConstant.JWT_SECERT.getMsg());
        return new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
    }

    /**
     * 解析JWT
     *
     * @param token
     * @return
     */
    public static Object checkJWT(String token) {
        try {
            /*提供秘钥解析token*/
            return Jwts.parser().setSigningKey(key).parse(token).getBody();
        } catch (ExpiredJwtException e) {
            String message = e.getMessage();
           /* e.printStackTrace();*/
            System.out.println("Jwt异常："+message);
            return null;
        }
        /*return null;*/
    }
}
